/*
 * CAnimationRecord.h
 *
 *  Created on: 07.04.2012
 *      Author: caffeine
 *
 *      Хранит себе запись об одной анимации. Например анимация бега
 */

#ifndef ANIMATIONRECORD_H_
#define ANIMATIONRECORD_H_
#include <lampe/animation/IAnimationRecord.h>
#include <ISkinnedMesh.h>
#include <IAnimatedMeshSceneNode.h>




namespace lampe{
namespace animation{


class CAnimation;

class CAnimationRecord:virtual public IAnimationRecord{
private:

	class Event_obejct:public irr::scene::IAnimationEndCallBack{
	private:
		CAnimationRecord*self;
	public:
		Event_obejct(CAnimationRecord*self);
		virtual void OnAnimationEnd(irr::scene::IAnimatedMeshSceneNode* node);
	};

	String name;
	u32 start;
	u32 end;
	CAnimation*parent;
	f32 speed;
	f32 transitionTime;
	LAMPE_VECTOR_VENDOR<IAnimationCallback*> events;
	Event_obejct*event;

	void copyCAnimation(irr::scene::ISkinnedMesh::SJoint*from,irr::scene::ISkinnedMesh::SJoint*to,u32 add,irr::scene::ISkinnedMesh*mesh);
public:

	virtual void OnAnimationEnd(irr::scene::IAnimatedMeshSceneNode* node);

	virtual void addAnimationEndListener(IAnimationCallback*listener);
	virtual void removeAnimationEndListener(IAnimationCallback*listener);

	virtual IAnimationCallback*getListener(u32 index);
	virtual u32 getListenerCount();

	virtual u32 getLength();

	/***
	 * Возвращяет анимационную группу, к которой привязана данная анимация
	 *
	 * @return анимационная группа данной анимации
	 */
	virtual IAnimation*getParent();

	/***
	* Возвращяет имя анимации
	*
	* @return имя костной анимации
	* */
	virtual String getName();

	/**
	* Устанавливает имя анимации
	*
	* @param name нове имя костной анимации
	* */
	virtual void setName(String name);
	
	/***
	* Устанавливает скорость анимации
	*
	* @param speed скорость анимации
	* */
	virtual void setSpeed(f32 speed);
	
	/***
	* Возвращяет скорость данной анимации
	*
	* @return скорость данной анимации
	* */
	virtual f32 getSpeed();
	
	/***
	* Устанавливает данную анимацию для костного меша
	*
	* @param node узел, которому нужно устанавить данную анимацию
	* */
	virtual void useFor(irr::scene::IAnimatedMeshSceneNode*node);

	/***
	 * Устанавливает вермя перехода к этой анимации
	 *
	 * @param time время, за которое старая анимация плавно превратится в данную
	 * */
	virtual void setTransitionTime(f32 time);

	/***
	 * Возвращяет время перехода к этой анимации
	 *
	 * @return время, за которое старая анимация плавно превратится в данную
	 * */
	virtual f32 getTransitionTime();
	
	CAnimationRecord(u32 startFrame,u32 endFrame,String name,irr::scene::ISkinnedMesh*mesh,CAnimation*parent);
	virtual ~CAnimationRecord();
};




}//namespace animation
}//namespace lampe
#endif /* ANIMATIONRECORD_H_ */
